package com.ungs.form;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.FlowLayout;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.ArrayList;
import java.util.List;

import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.border.LineBorder;

import com.ungs.entities.Calidad;
import com.ungs.entities.FormatoPapel;
import com.ungs.entities.Material;
import com.ungs.entities.Variante;
import com.ungs.utils.ValidacionCampo;

public class AddMaterialForm extends JDialog {

	private static final long serialVersionUID = 1L;
	private final JPanel contentPanel = new JPanel();
	private JTextField txtCalidad;
	private JTextField txtCantidad;
	private JTextField txtElemento;
	private JTextField txtFormatoHoja;
	private JTextField txtGramaje;
	private JTextField txtPliegosEnDemasia;
	private JTextField txtPliegosXHoja;
	private JTextField txtPosesXPliego;
	private JTextField txtVariante;

	private Material material;
	private Calidad calidad;
	private Variante variante;
	private FormatoPapel formatoPapel;
	private int cantEntregar;

	/**
	 * Create the dialog. agregar = true : Se agrega el material. agregar =
	 * false : Se modifica el material.
	 */
	public AddMaterialForm(JDialog parent, boolean agregar, Material material,
			int cantEntregar) {
		super(parent, true);
		setResizable(false);
		this.cantEntregar = cantEntregar;
		setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
		this.setLocationRelativeTo(parent);
		this.material = material;
		initForm();
		iniciaMaterial(agregar);
	}

	/**
	 * Inicia el Form
	 */
	private void initForm() {
		setBounds(100, 100, 334, 375);
		getContentPane().setLayout(new BorderLayout());
		contentPanel.setBorder(new LineBorder(new Color(0, 0, 0)));
		getContentPane().add(contentPanel, BorderLayout.CENTER);
		contentPanel.setLayout(null);
		{
			JLabel lbElemento = new JLabel("Elemento:");
			lbElemento.setBounds(10, 11, 91, 14);
			contentPanel.add(lbElemento);
		}
		{
			JLabel lbCantidad = new JLabel("Cantidad:");
			lbCantidad.setBounds(10, 41, 76, 14);
			contentPanel.add(lbCantidad);
		}
		{
			JLabel lbCalidad = new JLabel("Calidad:");
			lbCalidad.setBounds(10, 72, 76, 14);
			contentPanel.add(lbCalidad);
		}
		{
			JLabel lbVariante = new JLabel("Variante:");
			lbVariante.setBounds(10, 103, 76, 14);
			contentPanel.add(lbVariante);
		}
		{
			JLabel lbGramaje = new JLabel("Gramaje:");
			lbGramaje.setBounds(10, 134, 76, 14);
			contentPanel.add(lbGramaje);
		}
		{
			JLabel lbFormatoHoja = new JLabel("Formato Hoja:");
			lbFormatoHoja.setBounds(10, 165, 91, 14);
			contentPanel.add(lbFormatoHoja);
		}
		{
			JLabel lbPosesXPliego = new JLabel("Poses por Pliego:");
			lbPosesXPliego.setBounds(10, 196, 91, 14);
			contentPanel.add(lbPosesXPliego);
		}
		{
			JLabel lbPlegosEnDemasia = new JLabel("Pliegos en Demasia:");
			lbPlegosEnDemasia.setBounds(10, 232, 114, 14);
			contentPanel.add(lbPlegosEnDemasia);
		}
		{
			JLabel lbPliegosXHoja = new JLabel("Pliegos por Hoja:");
			lbPliegosXHoja.setBounds(10, 265, 91, 14);
			contentPanel.add(lbPliegosXHoja);
		}
		{
			txtElemento = new JTextField();
			txtElemento.addKeyListener(new KeyAdapter() {
				@Override
				public void keyTyped(KeyEvent e) {
					ValidacionCampo.verificarLargoCamposJTextField(e,
							txtElemento, 10);
				}
			});
			txtElemento.setBounds(134, 5, 118, 20);
			contentPanel.add(txtElemento);
			txtElemento.setColumns(10);
		}
		{
			txtCantidad = new JTextField();
			txtCantidad.addKeyListener(new KeyAdapter() {
				@Override
				public void keyTyped(KeyEvent e) {
					ValidacionCampo.verificarSoloNumeros(e);
					ValidacionCampo.verificarLargoCamposJTextField(e,
							txtCantidad, 10);
				}
			});
			txtCantidad.setBounds(134, 38, 118, 20);
			contentPanel.add(txtCantidad);
			txtCantidad.setColumns(10);
		}
		{
			txtCalidad = new JTextField();
			txtCalidad.setBackground(Color.LIGHT_GRAY);
			txtCalidad.setEditable(false);
			txtCalidad.setBounds(134, 69, 118, 20);
			contentPanel.add(txtCalidad);
			txtCalidad.setColumns(10);
		}
		{
			txtVariante = new JTextField();
			txtVariante.setBackground(Color.LIGHT_GRAY);
			txtVariante.setEditable(false);
			txtVariante.setBounds(134, 100, 118, 20);
			contentPanel.add(txtVariante);
			txtVariante.setColumns(10);
		}
		{
			txtGramaje = new JTextField();
			txtGramaje.addKeyListener(new KeyAdapter() {
				@Override
				public void keyTyped(KeyEvent e) {
					ValidacionCampo.verificarSoloNumeros(e);
					ValidacionCampo.verificarLargoCamposJTextField(e,
							txtGramaje, 10);
				}
			});
			txtGramaje.setBounds(134, 134, 64, 20);
			contentPanel.add(txtGramaje);
			txtGramaje.setColumns(10);
		}
		{
			txtFormatoHoja = new JTextField();
			txtFormatoHoja.setBackground(Color.LIGHT_GRAY);
			txtFormatoHoja.setEditable(false);
			txtFormatoHoja.setBounds(134, 165, 118, 20);
			contentPanel.add(txtFormatoHoja);
			txtFormatoHoja.setColumns(10);
		}
		{
			txtPosesXPliego = new JTextField();
			txtPosesXPliego.addKeyListener(new KeyAdapter() {
				@Override
				public void keyTyped(KeyEvent e) {
					ValidacionCampo.verificarSoloNumeros(e);
					ValidacionCampo.verificarLargoCamposJTextField(e,
							txtPosesXPliego, 10);
				}
			});
			txtPosesXPliego.setBounds(134, 196, 118, 20);
			contentPanel.add(txtPosesXPliego);
			txtPosesXPliego.setColumns(10);
		}
		{
			txtPliegosEnDemasia = new JTextField();
			txtPliegosEnDemasia.addKeyListener(new KeyAdapter() {
				@Override
				public void keyTyped(KeyEvent e) {
					ValidacionCampo.verificarSoloNumeros(e);
					ValidacionCampo.verificarLargoCamposJTextField(e,
							txtPliegosEnDemasia, 10);
				}
			});
			txtPliegosEnDemasia.setBounds(134, 232, 118, 20);
			contentPanel.add(txtPliegosEnDemasia);
			txtPliegosEnDemasia.setColumns(10);
		}
		{
			txtPliegosXHoja = new JTextField();
			txtPliegosXHoja.addKeyListener(new KeyAdapter() {
				@Override
				public void keyTyped(KeyEvent e) {
					ValidacionCampo.verificarSoloNumeros(e);
					ValidacionCampo.verificarLargoCamposJTextField(e,
							txtPliegosXHoja, 10);
				}
			});
			txtPliegosXHoja.setBounds(134, 265, 118, 20);
			contentPanel.add(txtPliegosXHoja);
			txtPliegosXHoja.setColumns(10);
		}
		{
			JButton btnCalidad = new JButton("");
			btnCalidad.addMouseListener(new MouseAdapter() {
				@Override
				public void mouseClicked(MouseEvent e) {
					eventoBotonCalidad();
				}
			});
			btnCalidad.setBounds(276, 69, 23, 23);
			contentPanel.add(btnCalidad);
		}
		{
			JButton btnVariante = new JButton("");
			btnVariante.addMouseListener(new MouseAdapter() {
				@Override
				public void mouseClicked(MouseEvent e) {
					eventoBotonVariante();
				}
			});
			btnVariante.setBounds(276, 103, 23, 23);
			contentPanel.add(btnVariante);
		}
		{
			JButton btnFormatoHoja = new JButton("");
			btnFormatoHoja.addMouseListener(new MouseAdapter() {
				@Override
				public void mouseClicked(MouseEvent e) {
					eventoBotonFormatoPapel();
				}
			});
			btnFormatoHoja.setBounds(276, 165, 23, 23);
			contentPanel.add(btnFormatoHoja);
		}

		JLabel lblGr = new JLabel("Gr/m2.");
		lblGr.setBounds(208, 137, 46, 14);
		contentPanel.add(lblGr);
		{
			JPanel buttonPane = new JPanel();
			buttonPane.setLayout(new FlowLayout(FlowLayout.RIGHT));
			getContentPane().add(buttonPane, BorderLayout.SOUTH);
			{
				JButton okButton = new JButton("Aceptar");
				okButton.addMouseListener(new MouseAdapter() {
					@Override
					public void mouseClicked(MouseEvent e) {
						eventoBotonAgregar();
					}
				});
				buttonPane.add(okButton);
				getRootPane().setDefaultButton(okButton);
			}
			{
				JButton cancelButton = new JButton("Cancelar");
				cancelButton.addMouseListener(new MouseAdapter() {
					@Override
					public void mouseClicked(MouseEvent e) {
						eventoBotonCancelar();
					}
				});
				cancelButton.setActionCommand("Cancel");
				buttonPane.add(cancelButton);
			}
		}
	}

	private void iniciaMaterial(boolean agregar) {
		if (agregar) {
			this.setTitle("Agregar Material");
		} else {
			this.setTitle("Modificar Material");

			calidad = material.getCalidad();
			formatoPapel = material.getFormatoPapel();
			variante = material.getVariante();
			txtElemento.setText(material.getElemento());
			txtCantidad.setText(String.valueOf(material.getCantidad()));
			txtCalidad.setText(material.getCalidad().getDescripcion());
			txtVariante.setText(material.getVariante().getDescripcion());
			txtGramaje.setText(String.valueOf(material.getGramaje()));
			txtFormatoHoja
					.setText(material.getFormatoPapel().getFormatoPapel());
			txtPosesXPliego.setText(String.valueOf(material.getPosesXPliego()));
			txtPliegosEnDemasia.setText(String.valueOf(material
					.getPliegosEnDemasia()));
			txtPliegosXHoja.setText(String.valueOf(material.getPliegosXHoja()));
		}
	}

	/**
	 * Evento del boton Agregar
	 */
	private void eventoBotonAgregar() {
		List<String> listaFaltantes = new ArrayList<String>();
		boolean faltante = false;
		if (material == null) {
			material = new Material();
		}

		// ELEMENTO
		String elemento = "";
		if (!txtElemento.getText().trim().isEmpty()) {
			elemento = txtElemento.getText().toUpperCase();
		} else {
			listaFaltantes.add("ELEMENTO");
			faltante = true;
		}

		// CANTIDAD
		int cantidad = 0;
		if (!txtCantidad.getText().trim().isEmpty()) {
			cantidad = Integer.parseInt(txtCantidad.getText());
		} else {
			listaFaltantes.add("CANTIDAD");
			faltante = true;
		}

		// CALIDAD
		if (calidad == null) {
			listaFaltantes.add("CALIDAD");
			faltante = true;
		}

		// VARIANTE
		if (variante == null) {
			listaFaltantes.add("VARIANTE");
			faltante = true;
		}

		// GRAMAJE
		int gramaje = 0;
		if (!txtGramaje.getText().trim().isEmpty()) {
			gramaje = Integer.parseInt(txtGramaje.getText());
		} else {
			listaFaltantes.add("GRAMAJE");
			faltante = true;
		}

		// FORMATO PAPEL
		if (formatoPapel == null) {
			listaFaltantes.add("FORMATO PAPEL");
			faltante = true;
		}

		int posesXPliego = 0;
		if (!txtPosesXPliego.getText().trim().isEmpty()) {
			posesXPliego = Integer.parseInt(txtPosesXPliego.getText());
		} else {
			listaFaltantes.add("POSES X PLIEGOS");
			faltante = true;
		}

		int pliegosEnDemasia = 0;
		if (!txtPliegosEnDemasia.getText().trim().isEmpty()) {
			pliegosEnDemasia = Integer.parseInt(txtPliegosEnDemasia.getText());
		} else {
			listaFaltantes.add("PLIEGOS EN DEMASIA");
			faltante = true;
		}

		int pliegosXHoja = 0;
		if (!txtPliegosXHoja.getText().trim().isEmpty()) {
			pliegosXHoja = Integer.parseInt(txtPliegosXHoja.getText());
		} else {
			listaFaltantes.add("PLIEGOS POR HOJA");
			faltante = true;
		}

		if (!faltante) {
			// CALCULAR
			int pliegosNetos = 0;
			int cantHojas = 0;

			if ((cantidad * cantEntregar) % posesXPliego != 0) {
				pliegosNetos = ((cantidad * cantEntregar) / posesXPliego) + 1;
			} else {
				pliegosNetos = ((cantidad * cantEntregar) / posesXPliego);
			}

			if ((pliegosNetos + pliegosEnDemasia) % pliegosXHoja != 0) {
				cantHojas = ((pliegosNetos + pliegosEnDemasia) / pliegosXHoja) + 1;
			} else {
				cantHojas = (pliegosNetos + pliegosEnDemasia) / pliegosXHoja;
			}

			material.setElemento(elemento);
			material.setCantidad(cantidad);
			material.setCalidad(calidad);
			material.setVariante(variante);
			material.setGramaje(gramaje);
			material.setFormatoPapel(formatoPapel);
			material.setPosesXPliego(posesXPliego);
			material.setPliegosNetos(pliegosNetos);
			material.setPliegosEnDemasia(pliegosEnDemasia);
			material.setPliegosXHoja(pliegosXHoja);
			material.setCantHojas(cantHojas);

			this.setVisible(false);
			this.dispose();

		} else {
			material = null;
			String mensaje = "";
			for (String mensajeFor : listaFaltantes) {
				mensaje = mensaje + "\n" + mensajeFor;
			}
			JOptionPane.showMessageDialog(this,
					"Completar los siguientes campos:" + mensaje, "Completar",
					JOptionPane.WARNING_MESSAGE);
		}
	}

	/**
	 * Evento del boton Cancelar
	 */
	private void eventoBotonCancelar() {
		this.setVisible(false);
		this.dispose();
	}

	/**
	 * Evento del boton Calidad - Abre la busqueda de Calidad.
	 */
	private void eventoBotonCalidad() {
		ConsultaCalidadForm consultaCalidadForm = new ConsultaCalidadForm(this);
		consultaCalidadForm.setVisible(true);
		calidad = consultaCalidadForm.getCalidad();
		if (calidad != null) {
			consultaCalidadForm.dispose();
			txtCalidad.setText(calidad.getDescripcion());
		}
	}

	/**
	 * Evento del boton Variante - Abre la busqueda de Variante.
	 */
	private void eventoBotonVariante() {
		ConsultaVarianteForm consultaVarianteForm = new ConsultaVarianteForm(
				this);
		consultaVarianteForm.setVisible(true);
		variante = consultaVarianteForm.getVariante();
		if (variante != null) {
			consultaVarianteForm.dispose();
			txtVariante.setText(variante.getDescripcion());
		}
	}

	/**
	 * Evento del boton Formato Papel - Abre la busqueda de Formato Papel.
	 */
	private void eventoBotonFormatoPapel() {
		ConsultaFormatoPapelForm consultaFormatoPapelForm = new ConsultaFormatoPapelForm(
				this);
		consultaFormatoPapelForm.setVisible(true);
		formatoPapel = consultaFormatoPapelForm.getFormatoPapel();
		if (formatoPapel != null) {
			consultaFormatoPapelForm.dispose();
			txtFormatoHoja.setText(formatoPapel.getFormatoPapel());
		}
	}

	public void setMaterial(Material material) {
		this.material = material;
	}

	public Material getMaterial() {
		return material;
	}

	public void setFormatoPapel(FormatoPapel formatoPapel) {
		this.formatoPapel = formatoPapel;
	}

	public FormatoPapel getFormatoPapel() {
		return formatoPapel;
	}
}
